package modelo.funciones;


public class Redondear {
	
	/**
	 * Este variable se usa en el metodo redondear. Su valor por defecto es 4.
	 */
	public static int cifrasDecimalesSignificativas = 4;
	
	/**
	 * Este metodo redondea el numero recibido como parametro a la cantidad de cifras decimales significativas
	 * indicada en la variable estatica correspondiente.
	 * @see OperacionSobreFunciones#cifrasDecimalesSignificativas
	 * @param numero Double que se quiere redondear.
	 * @return El numero redondeado.
	 */
	public static double redondear(double numero) {
		double resultado = numero;
		
		String stringValor = Double.toString(numero); //Paso el valor a un string
		
		//Separo el string en parte entera y parte decimal
		String parteEntera = stringValor.substring(0, stringValor.indexOf('.'));
		String parteDecimal = stringValor.substring(stringValor.indexOf('.')+1, stringValor.length());
		/*Si la cantidad de cifras de la parte decimal es menor o igual a 
		 * Funcion.cifrasDecimalesSignificativas retorno el valor tal cual como lo recibi.
		 */
		
		if (parteDecimal.length() <= cifrasDecimalesSignificativas) resultado = numero;
		
		else {
			/* Si la parte decimal esta en notacion cientifica, evaluo el exponente y redondeo.
			 */
			if (parteDecimal.contains("E")) {
				
				String exponente = parteDecimal.substring(parteDecimal.indexOf('E')+1, parteDecimal.indexOf('E')+4);
				
				Integer exp = Integer.parseInt(exponente);
				if (exp.intValue() < -cifrasDecimalesSignificativas) {
					parteDecimal = "0";
					for (int i = 2; i<=cifrasDecimalesSignificativas; i++)
						parteDecimal = parteDecimal.concat("0");
					String Resultado = "0" + "." + parteDecimal;
					resultado = Double.parseDouble(Resultado);
				}
			}

			/*Sino, examino el digito en la posicion cifrasDecimalesSignificativas + 1.
			 */
			else {
				Character digitoEnChar = new Character(parteDecimal.charAt(cifrasDecimalesSignificativas));
				int digito = Character.getNumericValue(digitoEnChar.charValue());
				
				/*Si el digito es menor a 5, trunco la parte decimal dejando solo los primeros
				 * (Funcion.cifrasDecimalesSignificativas) digitos
				 */
				
				if (digito < 5) {
					
					String parteDecimalFinal = parteDecimal.substring(0, cifrasDecimalesSignificativas);
					
					String stringResultado = parteEntera + "." + parteDecimalFinal;
					
					resultado = Double.parseDouble(stringResultado);
				}
				// Sino, le sumo 1 al digito en la posicion (Funcion.cifrasDecimalesSignificativas) 
				else {
					String auxString = parteDecimal.substring(0, cifrasDecimalesSignificativas);
					Integer aux = new Integer(Integer.parseInt(auxString));
					int intAux = aux.intValue() + 1;
					aux = new Integer(intAux);
					String parteDecimalFinal = Integer.toString(aux.intValue());
					/*Si la parte decimal tiene ahora mas digitos que antes, tengo que sacarle el primero
					 *(que va a ser un uno) y sumarselo a la parteEntera. Sino
					 *devuelvo la parte decimal junto a la parteEntera original.
					 */
					
					if (parteDecimalFinal.length() > auxString.length()) {
						
							parteDecimalFinal = parteDecimalFinal.substring(1, parteDecimalFinal.length());
							Integer aux2 = new Integer(Integer.parseInt(parteEntera));
							int intAux2 = aux2.intValue() + 1;
							aux2 = new Integer(intAux2);
							String parteEnteraFinal = Integer.toString(aux2.intValue());
							String stringResultado = parteEnteraFinal + "." + parteDecimalFinal;
							resultado = Double.parseDouble(stringResultado);
						
					}
					// Devuelvo la nueva parteDecimal junto con la parteEntera original
					else {
						
						String stringResultado = parteEntera + "." + parteDecimalFinal;
						resultado = Double.parseDouble(stringResultado);
					
					}
				}
			}
			
		}	
		return resultado;	
	}
}
